#include<iostream>
#include<memory>
//RAII resource acquisition is initialization

//请记住
/**
 * 1、为防止资源泄漏，请使用RAI对象，它们在构造函数中获得资源并在析构函数中释放资源。
 * 
 * 2、两个常被使用的RAI classes分别是tr1::shared_ptr和auto_ptr
 * 前者通常是较佳选择，因为其copy行为比较直观。若选择auto_ptr,复制动作会使它(被复制物)指向 null。
 * 
 * /

/*
1、获得资源后立刻放进管理对象(managingobject)内。实际上“以对象管理资源”的观念常被称为“资源取得时机便是初始化时机”
(ResourceAcquisition ls Initialization;RAI!)，因为我们几乎总是在获得一笔资源后于同一语句内以它初始化某个管理对象。
有时候获得的资源被拿来赋值(而非初始化)某个管理对象，但不论哪一种做法，每一笔资源都在获得的同时立刻被放进管理对象中。

2、管理对象(managingobject)运用析构函数确保资源被释放。
不论控制流如何离开区块，一旦对象被销毁(例如当对象离开作用域)其析构函数自然会被自动调用，于是资源被释放。
如果资源释放动作可能导致抛出异常，事情变得有点棘手，但条款8已经能够解决这个问题，所以这里我们也就不多操心了。
*/

/*引入智能指针*/

//shared_ptr  make_shared  自动回收

class Class
{
    public:
        Class(){std::cout << "default constructor" << std::endl;};
        ~Class(){std::cout << "default destructor" << std::endl;};
};

int main(int argc, char const *argv[])
{
    //Class* c = (*Class)malloc(sizeof(Class)) ;
    //std::shared_ptr<Class> b (new Class);

    //std::shared_ptr<Class> c = std::make_shared<Class>();
    //delete c;
    return 0;
}

